iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
1

今天準備逆向並找出陣列的特徵。包括陣列基本特徵、使用 for loop 遍歷陣列元素、二維陣列。

基本特徵

可以看到數字 10h, 20h, 30h 被 mov 到 Stack 中,後面再被 call sub_1070(printf())。

解答公布:

#include <stdio.h>

int main() {
  int Array[] = {16, 32, 48};
  printf("Array[0]=%d\n", Array[0]);
  printf("Array[0]=%d\n", Array[1]);
  printf("Array[0]=%d\n", Array[2]);
  return 0;
}

for 遍歷

在 loc_11CC 中的 [rbp-24h] 為變數 i,因為初始沒賦值,所以前面的 mov dword 沒有看到它的身影。可以看到熟悉的環狀圖型,而在 loc_11A9 最下面有 add dword ptr [rbp-24h], 1 可以看出它是一個 for 迴圈,讓 [rbp-24h] 每次加一,若小於4則繼續迴圈,反之跳出。

解答公布:

#include<stdio.h>

int main(void){
    int Array[] = {0, 1, 2, 3, 4};
    for(int i; i <= 4; i++){
        printf("The number of Array[%d] is %d\n", i, Array[i]);
    }
    return 0;
}

二維陣列

在 loc_1203 中的 [rbp - 28h],是變數 i 儲存的記憶體位置;而 loc_11F9 中的 [rbp - 24h],是變數 j 儲存的記憶體位置。可以看到 i 與 j 的初始值皆是0,而 i 的上限是 1,j 的上限是2。此外在 loc_11C0 的 add dword ptr [rbp-24h], 1 與 loc_11F9 的 jle 為 false 情況下的 add dword ptr [rbp-28h], 1 皆可說明 i 與 j 接使用 for 迴圈。

解答公布:

#include<stdio.h>

int main(){
  int Array[2][3] = {{16, 32, 48}, {64, 80, 96}};
  for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
      printf("Array[%d][%d] is %d\n", i, j, Array[i][j]);
    }
  }
    return 0;
}

Reference

結論

今天講解陣列在逆向的時候的特徵,明天來講解指標在逆向的時候到底長什麼樣子?


上一篇
Day21 - 逆向並找出函式呼叫的特徵
下一篇
Day23 - 逆向並找出指標的特徵
系列文
逆向工程 – 從入門到放棄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言